package com.xd.study.activity;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.xd.study.R;
import com.xd.study.utility.MyBroadcastReceiver2;
import com.xd.study.utility.MyBroadcastReceiver3;

/**
 * Created by DGF on 2015/5/5.
 * Broadcast（广播）：是一种广泛运用的在应用程序之间传输信息的机制。
 * BroadcastReceiver（广播接收者）：是对发送出来的广播进行过滤接收并响应的一类组件，它就是用来接收来自系统和应用中的广播。
 * ********************用途********************
 * 当开机完成后系统会产生一条广播，对其进行响应，可实现开机启动
 * 当网络状态发生改变时产生一条广播
 * 当电池电量发生改变时产生一条广播
 */
public class BroadcastActivity extends Activity {

    private MyBroadcastReceiver3 broadcastReceiver3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.broadcast);

        /**
         * ********************发送广播********************
         * 把信息装入一个Intent对象（如Action、Category）
         * 通过调用相应的方法将Intent对象以广播方式发送出去
         * sendBroadcast()
         * sendOrderBroadcast()
         * sendStickyBroadcast()
         * ********************接收广播********************
         * 当Intent发送后以后，所有已经注册的BroadcastReceiver会检查注册时的IntentFilter
         * 是否与发送的Intent相匹配，若匹配则就会调用BroadcastReceiver的onReceive()方法。
         * 所以当我们定义一个BroadcastReceiver的时候，都需要实现onReceive()方法。
         * BroadcastReceiver的注册可以通过 静态注册 或 代码注册
         * BroadcastReceiver的生命周期只有10秒，不能做一些比较耗时的操作，
         * 可以通过将信息发送给Service，让Service处理耗时的操作。
         * 耗时操作不要使用子线程，很容易被杀掉。
         */

        Button btnSend1 = (Button)this.findViewById(R.id.broadcast_btn_send1);
        Button btnSend2 = (Button)this.findViewById(R.id.broadcast_btn_send2);
        Button btnSend3 = (Button)this.findViewById(R.id.broadcast_btn_send3);

        /**
         * 发送普通广播
         * ******************************
         * 接收广播：
         * 1、自定义BroadcastReceiver，实现onReceive方法
         * 2、静态注册：在AndroidManifest.xml中注册receiver，绑定action或category
         */
        btnSend1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent();
                intent.putExtra("msg", "这是一条普通广播");
                intent.setAction("Broadcast1");
                sendBroadcast(intent);
            }
        });

        /**
         * 动态注册receiver
         * 动态注册的优先级比静态注册高
         */
//        IntentFilter intentFilter = new IntentFilter("Broadcast1");
//        MyBroadcastReceiver2 broadcastReceiver2 = new MyBroadcastReceiver2();
//        registerReceiver(broadcastReceiver2, intentFilter);

        /**
         * 发送有序广播
         */
        btnSend2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("msg", "这是一条有序广播");
                intent.setAction("Broadcast1");
                sendOrderedBroadcast(intent, null);
            }
        });

        /**
         * 发送异步广播
         * 普通广播和有序广播都是用完就销毁；且需要先注册后发送
         * 异步广播可以一致存在，可以先发送后注册
         */
        btnSend3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送广播
                Intent intent = new Intent();
                intent.putExtra("msg", "这是一条异步广播");
                intent.setAction("Broadcast3");
                sendStickyBroadcast(intent);

                //注册接收器
                //需要设置权限 BROADCAST_STICKY
                //在退出窗体时，一定要销毁动态注册的接收器
                IntentFilter intentFilter = new IntentFilter("Broadcast3");
                broadcastReceiver3 = new MyBroadcastReceiver3();
                registerReceiver(broadcastReceiver3, intentFilter);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        //在退出窗体时，一定要销毁动态注册的接收器
//        unregisterReceiver(broadcastReceiver2);
        unregisterReceiver(broadcastReceiver3);
    }
}
